function price = approximateAmericanCall(S, X, T, r, b, v)
    % Barone-Adesi And Whaley

    if b >= r
        price = priceEuropeanOption('Call', S, X, T, r, b, v);
    else
        Sk = Kc(X, T, r, b, v);
        N = 2 * b / v^2;
        k = 2 * r / (v^2 * (1 - exp(-1 * r * T)));
        d1 = (log(Sk / X) + (b + (v^2) / 2) * T) / (v * sqrt(T));
        Q2 = (-1 * (N - 1) + sqrt((N - 1)^2 + 4 * k)) / 2;
        a2 = (Sk / Q2) * (1 - exp((b - r) * T) * normcdf(d1));
        if S < Sk
            price = priceEuropeanOption('Call', S, X, T, r, b, v) + a2 * (S / Sk)^Q2;
        else
            price = S - X;
        end
    end
end

